package com.wl.designpattern.command;

/**
 * 命令模式
 * 将一个请求封装成一个对象，从而让你使用不同的请求把客户端参数化，对请求排队或者记录日志，可以提供命令的撤销和恢复功能。
 *
 *
 * Command（命令角色）：接口或者抽象类，定义要执行的命令。
 * ConcreteCommand（具体命令角色）：命令角色的具体实现，通常会持有接收者，并调用接收者来处理命令。
 * Invoker（调用者角色）：负责调用命令对象执行请求，通常会持有命令对象（可以持有多个命令对象）。Invoker是Client真正触发命令并要求命令执行相应操作的地方（使用命令对象的入口）。
 * Receiver（接收者角色）：是真正执行命令的对象。任何类都可能成为一个接收者，只要它能够实现命令要求实现的相应功能。
 * Client（客户端角色）：Client可以创建具体的命令对象，并且设置命令对象的接收者。
 *
 * 应用场景
 * 需要对行为进行记录，撤销，重做，事务处理时。
 * 对于大多数请求——响应模式的功能，比较适合使用命令模式。
 *
 * 优点
 * 调用者与接受者之间的解藕。
 * 易于扩展，扩展命令只需新增具体命令类即可，符合开放封闭原则。
 *
 * 缺点
 * 过多的命令会造成过多的类。
 *
 * android 应用
 * Thread就是一个简单的命令模式
 *
 * Created by wangliang on 2021/2/27.
 */
public class Test {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();//创建命令接收者
        Command command = new ShutdownCommand(receiver);//创建一个命令的具体实现对象，并指定命令接收者
        Invoker invoker = new Invoker(command);//创建一个命令调用者，并指定具体命令
        invoker.action();//发起调用命令请求
    }
}
